/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DSB.Model.Toerist;

import DSB.Model.Kaart.Map;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

/**
 *
 * @author Gebruiker
 * 
 */
public class Toerist {

    private static Toerist toerist;
    private static Taal _taal;
    private static MeetEenheid _meetEenheid;
    private static Map _map;
    
    // hieronder 2 regels voor de meet-eenheid via een state pattern
    final static int _metrisch = 0;
    final static int _foot = 1;
    
    // hieronder 3 regels voor state van talen.
    final static int Nederlands = 0;
    final static int Engels = 1;
    final static int Duits = 2;
    // omdat Nederlands als default meegegeven wordt kan dit de eerste taal zijn.

    /**
     * constructor voor het initialiseren van de klasse taal en meeteenheid
     * waarbij de voorwaarden ingesteld worden op Nederlands en Metrisch
     */
    private Toerist() {
        _taal = new Nederlands();
        _meetEenheid = new Metrisch();
    }

    /**
     *
     * @return 
     * Hieronder de singleton voor Toerist.
     */
    public static Toerist getInstance() {
        if (toerist == null) {
            toerist = new Toerist();
        }
        return toerist;
    }

    /**
     *
     * @param eenheid wordt gebruikt voor het vullen van de variabele die gekozen wordt
     * in het instellingenscherm
     * Ook is deze code onderdeel van een state pattern
     */
    public void ChangeMeetEenheid(int eenheid) {
        if (eenheid == _metrisch) {
            _meetEenheid = new Metrisch();
        } else if (eenheid == _foot) {
            _meetEenheid = new Foot();
        }
    }

    /**
     *
     * @param title
     * @return
     */
    public String getResource(String title) {
        return _taal.Translate(title);
    }

    
    /**
     *
     * @param lang Is het zelfde als de keuze metrisch
     * Ook is deze code onderdeel van een state pattern
     */
    public void ChangeLanguage(int lang) {
        if (lang == Nederlands) {
            _taal = new Nederlands();
        } else if (lang == Engels) {
            _taal = new Engels();
        } else if (lang == Duits) {
            _taal = new Duits();
        }
    }

    /**
     *
     * @return Deze methode geeft de gekozen taal terug,
     * de methode geeft de variabele terug vanuit de state
     * welke we in de observer vanuit de toeristcontroller aanroepen
     */
    public String getLanguage() {
        return _taal.getLanguage();
    }

    /**
     *
     * @return Deze methode geeft de gekozen taal terug,
     * de methode geeft de variabele terug vanuit de state
     * welke we in de observer vanuit de toeristcontroller aanroepen
     */
    public String GetMeetEenheidName() {
        return _meetEenheid.GetName();
    }

    /**
     *
     * @param map houdt de huidige geselecteerde map vast
     */
    public void setMap(Map map) {
        _map = map;
    }

    /**
     *
     * @return Deze methode haalt de originele kaart op, en rescaled deze naar een formaat welke in de GUI
     * zichtbaar wordt.
     */
    public BufferedImage getMap() {
        return resizeImage(0.08, _map.DrawOnMap());
        //return _map.DrawOnMap();
    }

    private BufferedImage resizeImage(double scale, BufferedImage original) {
        BufferedImage newImage = new BufferedImage((int) (original.getWidth(null) * scale), (int) (original.getHeight() * scale), BufferedImage.TYPE_INT_ARGB);

        Graphics2D grph = (Graphics2D) newImage.getGraphics();
        grph.scale(scale, scale);

        grph.drawImage(original, 0, 0, null);
        grph.dispose();
        return newImage;
    }
}
